iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0

觀前提醒:

  1. 我預設大家已經先思考並分析過題目,沒啥想法才開始 google 找解題靈感。若無,建議每題先花 1~2 顆番茄鐘的時間來分析題目比較好。可參考番茄鐘工作法
  2. 承上,既然已經有思考過了,那我這邊直接 po 題目 + 解題想法 + code +心得 。若已經在 code 內有足夠的註解了,那我可能解題想法 & 心得的部分就不會寫太多,免得干擾你的思考。
  3. 所有解法都是已經取得系統的 Accepted,但或許不是最優解法,請多包涵。
  4. 若對於解法不太懂,可以嘗試用 Chrome 的 debugger 來試跑看看 (教學文)
  5. 最後,歡迎在下面留言指教~教學相長才會進步歐~/images/emoticon/emoticon41.gif

題目

The count-and-say sequence is the sequence of integers with the first five terms as following:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 is read off as "one 1" or 11.
11 is read off as "two 1s" or 21.
21 is read off as "one 2, then one 1" or 1211.

Given an integer n where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence. You can do so recursively, in other words from the previous member read off the digits, counting the number of digits in groups of the same digit.

Note: Each term of the sequence of integers will be represented as a string.

Example 1:

Input: 1
Output: "1"
Explanation: This is the base case.

Example 2:

Input: 4
Output: "1211"
Explanation: For n = 3 the term was "21" in which we have two groups "2" and "1", "2" can be read as "12" which means frequency = 1 and value = 2, the same way "1" is read as "11", so the answer is the concatenation of "12" and "11" which is "1211".

解題想法

這題呢,小弟資質駑鈍,直接使用土方法暴力解決,詳情請直接參考下方 CODE + 註解 /images/emoticon/emoticon25.gif

CODE

/**
 * @param {number} n
 * @return {string}
 */
var countAndSay = function (n) {
  // 處理 edge case
  if (n === 1) {
    return "1";
  }

  let countSay = "1";
  for (let i = 1; i <= n - 1; i++) {
    // ASK: 為什麼是 1~n-1?
    // 因為第0趟時,countSay === "1";已經處理過了。
    let digit = countSay.charAt(0); //從左側開頭開始數
    let temp = countSay; // 先把整包 countSay 賦值給 temp。
    let count = 0;
    countSay = ""; // 清空儲存這輪數完的字串

    for (let j = 0; j <= temp.length - 1; j++) {
      // 數字相同,count++
      if (temp.charAt(j) === digit) {
        count++;
      } else {
        // 數字不同,將目前的 count 與digit加到字串,更新 digit,新的 count 從 "1" 開始數起
        countSay += count;
        countSay += digit;
        digit = temp.charAt(j);
        count = 1;
      }
    }
    // 當讀取到最後一位時,直接把計算好的結果加總到 countSay 後頭
    countSay += count;
    countSay += digit;
  }
  return countSay;
};

心得

  • 我在解題時,code裡面還使用了一種 .charAt()的技巧,可以按進去看看。
  • LeetCode 討論區內有些大大用迴圈就輕鬆 KO 題目,這種解法真D神啊,如果有大大看懂他的code的話,也可以在下方跟小弟交流~

謝謝大家的收看,LeetCode 小學堂我們下次見~/images/emoticon/emoticon29.gif


上一篇
[LeetCode with JavaScript] Day 6: Longest Common Prefix
下一篇
[LeetCode with JavaScript] Day 8: Reverse String
系列文
[LeetCode with JavaScript] 一起來刷 LeetCode吧 ~~~ (ノ>ω<)ノ30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言